package dominio;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

import org.junit.Before;
import org.junit.Test;

import applicationModels.Juego;

public class JuegoTest {

	private Fila fila;
	private Planta p1, p2;
	private Zombie zombie;
	private Juego juego;
	
	final private int FILA_PARA_ATACAR = 3;
	
	@Before
	public void setUp() throws Exception {
		
		juego = Juego.getInstance();
		juego.setFilaParaAtacar(FILA_PARA_ATACAR-1);

		/////// PLANTA 1
		p1 = mock(Planta.class);
		when(p1.getPuntosAtaque()).thenReturn(10);
		when(p1.getPuntosDefensa()).thenReturn(10);
		when(p1.getTerrestre()).thenReturn(true);
		
		Casillero casilla41 = juego.getCasillero(FILA_PARA_ATACAR, FILA_PARA_ATACAR);
		casilla41.plantar(p1);
		
		/////// PLANTA 2
		p2 = mock(Planta.class);
		when(p2.getPuntosAtaque()).thenReturn(10);
		when(p2.getPuntosDefensa()).thenReturn(10);
		when(p2.getTerrestre()).thenReturn(true);
		
		Casillero casilla42 = juego.getCasillero(FILA_PARA_ATACAR, FILA_PARA_ATACAR);
		casilla42.plantar(p2);
	}

	@Test
	public void testPelearPARA_PROBAR() {

		for(int i=0; i < 8; i++) {
			juego.setZombieAtacante(new Zombie(10, 100));
			juego.pelear();
		}
		
		System.out.println("VIDA PLANTA1: "+ p1.getPuntosDefensa());
		System.out.println("VIDA PLANTA2: "+ p2.getPuntosDefensa());
		System.out.println("PUNTOS ACTUALES: " + juego.getUsuario().getPuntos());

	}

	//@Test
	public void testPelearYGanar() {
		
		//p1.setPuntosDefensa(100);
		//p2.setPuntosDefensa(100);
		
		when(p1.getPuntosDefensa()).thenReturn(100);
		when(p2.getPuntosDefensa()).thenReturn(100);
		
		zombie = new Zombie(1, 1);
		
		juego.setZombieAtacante(zombie);
		
		juego.pelear();
		
		// Se murio el zombie
		assertTrue(zombie.estaMuerto());
		
		// Quedan plantas vivas
		assertTrue(juego.getElJardin().getFilas().get(FILA_PARA_ATACAR).hayPlantas());
	}
	
	//@Test
	public void testPelearYPerder() {
		
		p1.setPuntosDefensa(1);
		p2.setPuntosDefensa(1);
		
		// PuntosAtk, PuntosDef
		zombie = new Zombie(10, 1000);
		
		juego.setZombieAtacante(zombie);
		
		juego.pelear();
		
		// Se mueren las plantas de la fila
		assertTrue(p1.estaMuerta());
		assertTrue(p2.estaMuerta());
		
		// No quedan plantas en la fila
		assertFalse(fila.hayPlantas());
		
		// La vida del zombie disminuyo
		assertFalse(zombie.estaMuerto());
	}

}
